package 牛客网在线编程题库;

import java.util.Iterator;
import java.util.LinkedHashMap;

/**
 *在一个字符串(0<=字符串长度<=10000，全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1（需要区分大小写）.（从0开始计数）
 * 示例1
 * 输入
 * "google"
 * 返回值
 * 4
 */

public class _第一个只出现一次的字符 {
    public static void main(String[] args) {
        String str = "google";
        int target = FirstNotRepeatingChar(str);
        System.out.println(target);
    }

    public static int FirstNotRepeatingChar(String str) {
        // 校验合法性
        if (str.length() == 0) {
            return -1;
        }
        // 将字符串拆分为字符数组
        char[] chars = str.toCharArray();
        // 定义哈希表
        LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
        // 遍历字符数组
        for (int i = 0 ; i < chars.length ; i++) {
            // 取出当前字符
            char cur = chars[i];
            // 若哈希表中有这个key
            if (map.containsKey(cur)) {
                // 将出现次数+1再重新放入哈希表
                map.put(cur, map.get(cur) + 1);
            }else {
                // 若哈希表中没有这个key，则直接放入哈希表
                map.put(cur, 1);
            }
        }
        char c = '0';
        // 遍历出第一个出现的次数为1的字符
        Iterator<Character> iterator = map.keySet().iterator();
        while (iterator.hasNext()) {
            char key = iterator.next();
            if (map.get(key) == 1) {
                c = key;
                break;
            }
        }
        for (int i = 0 ; i < chars.length ; i++) {
            if (chars[i] == c) {
                return i;
            }
        }
        return -1;
    }
}
